/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.scp.dao.IDAOMovimientoCuentaBancaria;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.MovimientoCuentaBancaria;

/**
 *
 * @author DESARROLLO01
 */
@Repository("daoMovimientoCuentaBancaria")
public class DAOMovimientoCuentaBancariaImpl extends DaoImpl<MovimientoCuentaBancaria, Integer> implements IDAOMovimientoCuentaBancaria, Serializable {

    @Override
    public Collection<MovimientoCuentaBancaria> listarMovimientosCheques(int idEmpresa) throws DAOException {

        try {

            sessionFactory.getCurrentSession().flush();
            List listaMovBancarios = sessionFactory.getCurrentSession().createCriteria(MovimientoCuentaBancaria.class)
                    .createAlias("idCuentaBancaria", "cu")
                    .addOrder(Order.desc("id"))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("estadoMovimiento", MovimientoCuentaBancaria.ESTADO_MOV_CUENTA_BANCARIA.ABIERTO.getValor()))
                    .add(Restrictions.eq("formaMovimiento", "CHEQUE"))
                    .add(Restrictions.eq("tipoMovimiento", Constantes.TipoMovimiento.SALIDA))
                    .add(Restrictions.eq("cu.idEmpresa.id", idEmpresa))
                    .list();

            return listaMovBancarios;

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }

    @Override
    public List<MovimientoCuentaBancaria> listarMovimientoCuentaBancaria(
            MovimientoCuentaBancaria beanMovimientoCuentaBancaria, Date fechaInicio, Date fechaFinal) throws DAOException {

        try {
            List listaMovBancarios = new ArrayList();
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(MovimientoCuentaBancaria.class)
                    .createAlias("idCuentaBancaria", "cu")
                    .addOrder(Order.desc("fechaMovimiento"))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("cu.idEmpresa", beanMovimientoCuentaBancaria.getIdCuentaBancaria().getIdEmpresa()));

            if (beanMovimientoCuentaBancaria.getIdCuentaBancaria().getId() != -1) {
                query = query.add(Restrictions.eq("idCuentaBancaria", beanMovimientoCuentaBancaria.getIdCuentaBancaria()));
            } 

            if (fechaInicio == null && fechaFinal == null) {
                listaMovBancarios = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                listaMovBancarios = query.add(Restrictions.ge("fechaMovimiento", fechaInicio)).add(Restrictions.le("fechaMovimiento", fechaFinal)).list();
            } else if (fechaInicio == null) {
                listaMovBancarios = query.add(Restrictions.le("fechaMovimiento", fechaFinal)).list();
            } else if (fechaFinal == null) {
                listaMovBancarios = query.add(Restrictions.ge("fechaMovimiento", fechaInicio)).list();
            }

            return listaMovBancarios;

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }
}
